package org.dreamwork.compilation;

import java.util.ArrayList;
import java.util.List;

/**
 * 虚拟方法
 * Created by IntelliJ IDEA.
 * User: seth
 * Date: 2009-2-2
 * Time: 11:39:56
 */
public class VirtualMethod {
    private int modifier;
    private String name;
    private String returnType;
    private List<VirtualParameter> parameters = new ArrayList<VirtualParameter> ();
    private List<String> statements = new ArrayList<String> ();
    private List<String> exceptions = new ArrayList<String> ();

    /**
     * 获取方法的访问修饰符
     * @return 访问修饰符
     */
    public int getModifier () {
        return modifier;
    }

    /**
     * 设置方法的访问修饰符
     * @param modifier 访问修饰符
     */
    public void setModifier (int modifier) {
        this.modifier = modifier;
    }

    /**
     * 获取方法名称
     * @return 方法名称
     */
    public String getName () {
        return name;
    }

    /**
     * 设置方法名称
     * @param name 方法名称
     */
    public void setName (String name) {
        this.name = name;
    }

    /**
     * 获取方法返回类型
     * @return 合法的 java 类型
     */
    public String getReturnType () {
        return returnType;
    }

    /**
     * 设置方法的返回类型
     * @param returnType 合法的 java 类型
     */
    public void setReturnType (String returnType) {
        this.returnType = returnType;
    }

    /**
     * 向方法的参数列表中添加一个虚拟参数
     * @param param 虚拟参数
     */
    public void addParameter (VirtualParameter param) {
        parameters.add (param);
    }

    /**
     * 向虚拟方法中添加一个合法的 java 语句
     * @param stmt 合法的 java 语句
     */
    public void addStatement (String stmt) {
        statements.add (stmt);
    }

    /**
     * 向虚拟方法中声明异常列表中添加一个合法的 java 异常
     * @param ex 合法的 java 异常
     */
    public void addException (String ex) {
        exceptions.add (ex);
    }

    /**
     * 生成 java 代码
     * @return java 代码
     */
    @Override
    public String toString () {
        StringBuffer buff = new StringBuffer ();
        buff.append (Modifier.experssion [modifier]).append (" ");
        buff.append (returnType == null ? "void" : returnType).append (" ");
        buff.append (name).append (" (");
        for (int i = 0; i < parameters.size (); i ++) {
            if (i != 0) buff.append (", ");
            buff.append (parameters.get (i));
        }
        buff.append (")");
        if (exceptions.size () > 0) {
            buff.append (" throws ");
            for (int i = 0; i < exceptions.size (); i ++) {
                if (i != 0) buff.append (", ");
                buff.append (exceptions.get (i));
            }
        }
        buff.append ("{\n");
        for (String statement : this.statements) {
            statement = statement.trim ();
            buff.append (statement);
            char ch = statement.charAt (statement.length () - 1);
            if (ch != ';' && ch != '{' && ch != '}')
                buff.append (";");
            buff.append ("\n");
        }
        buff.append ("}\n");
        return buff.toString ();
    }
}